package com.zmn.oms.zmn.business.interfaces.chan;

import com.zmn.common.utils.pager.Operator;
import com.zmn.oms.common.dto.OmsBaseOperator;
import com.zmn.oms.common.exception.chan.ChannelFacadeException;
import com.zmn.oms.common.exception.chan.DuplicateOrderClueException;
import com.zmn.oms.model.dto.chan.OrderClueDetailDTO;
import com.zmn.oms.model.dto.chan.OrderClueDetailListQuery;
import com.zmn.oms.model.entity.chan.OrderClue;
import com.zmn.oms.model.entity.chan.OrderClueDetail;

import java.util.List;

/**
 * 类描述：渠道订单线索详情（线索单）业务接口
 *
 * @author lhl
 * @date 2020/12/29 15:52
 */
public interface FacadeOrderClueDetailBService {

    /**
     *  保存渠道订单线索详情（线索单）
     * @param orderClueDetail 渠道订单线索详情对象，该对象的 clueId 字段不能为null
     * @throws ChannelFacadeException 当保存失败时被抛出
     */
    void saveOrderClueDetail(OrderClueDetail orderClueDetail) throws ChannelFacadeException;

    /**
     * 条件查询
     * @param clueId
     * @return
     */
    OrderClueDetail findOrderClueDetailByClueId(Long clueId);

    /**
     * 条件查询
     * @param query
     * @return
     */
    List<OrderClueDetail> listOrderClueDetails(OrderClueDetailListQuery query);

    /**
     * 舍弃该订单线索（将状态置为忽略状态）
     * @param detailDTO
     * @throws ChannelFacadeException 当该线索的状态不允许变更为忽略状态时（已执行生成订单操作）被抛出
     */
    OrderClueDetail ignoreOrderClueDetail(OrderClueDetailDTO detailDTO) throws ChannelFacadeException;

    /**
     * 申请生成系统订单
     * @param detailDTO
     * @throws ChannelFacadeException 以下情形时被抛出：
     *      1. 该线索单的状态不是0（待处理）；
     *      2. 该线索已生成订单；
     *      3. 该线索已申请生成订单且申请未被处理;
     */
    OrderClueDetail apply2ZmnOrder(OrderClueDetailDTO detailDTO) throws ChannelFacadeException;

    /**
     * 将该线索单重置为“待处理”状态
     * @param detailDTO
     * @throws ChannelFacadeException 当该线索的状态不是“已忽略”时被抛出
     */
    OrderClueDetail resetState2Pending(OrderClueDetailDTO detailDTO) throws ChannelFacadeException;

    /**
     * 将该线索单标记为“已生成订单”状态，并保存系统单号
     * @param clueId
     * @param zmnOrderId
     * @throws ChannelFacadeException 当该线索的状态不是“待处理”时被抛出
     */
    OrderClueDetail saveZmnOrderIdByKey(Long clueId, Long zmnOrderId) throws ChannelFacadeException;

}
